ПолеНастройки.отд
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(******************************************************************************)
(**)                          ОТДЕЛ ПолеНастройки;
(****************************************************************************** 
 * НАЗНАЧЕНИЕ: ввод настроек Преобразователя Глагола
 ******************************************************************************)
ИСПОЛЬЗУЕТ
  Цепь        ИЗ "...\Отделы\Иное\",
  Ввод        ИЗ "...\Отделы\Обмен\",
  Настройки   ИЗ "...\Отделы\Обмен\",
  Файл        ИЗ "...\Отделы\Обмен\",
  Читать      ИЗ "...\Отделы\Обмен\",
  Писать      ИЗ "...\Отделы\Обмен\",
  Справка     ИЗ "...\Отделы\Обмен\",
  Надел       ИЗ "...\Отделы\Поле\",
  Памятка     ИЗ "...\Отделы\Поле\",
  Поле        ИЗ "...\Отделы\Поле\",
  Подложка    ИЗ "...\Отделы\Поле\",
  Черта       ИЗ "...\Отделы\Поле\",
  Холст       ИЗ "...\Отделы\Поле\",
  Крестик     ИЗ "...\Отделы\Поле\",
  Метка       ИЗ "...\Отделы\Поле\",
  Точка       ИЗ "...\Отделы\Поле\",
  Кнопка      ИЗ "...\Отделы\Поле\";

ПОСТ        (* виды приложения *)
  впТекстовое-  = 0;
  впОконное-    = 1;
  впБиблиотека- = 2;

ПЕР
  МПГ+:КЛЮЧ;(* вид преобразователя ВКЛ - МПГ, ОТКЛ - ПГ *)
  видПриложения-:ЦЕЛ;
            (* настройки (М)ПГ *)
  нПроверки:КЛЮЧ;
  нОтладчик:КЛЮЧ;
            (* путь к СРЕДА.отд *)
  срдПуть:ЦЕПЬ[200];
            (* все ключи через ";" *)
  ключи:ЦЕПЬ[200];

(******************************************************************************)
ЗАДАЧА СписатьИмяФайла-(имя+:ЦЕПЬ);
ПЕР
  памятка:Памятка.Доступ;
УКАЗ
  памятка:=Памятка.Найти("Приложение");
  ЕСЛИ памятка.строк > 0 ТО
    СПИСАТЬ(памятка.строки[0]^,имя)
  ИНАЧЕ
    имя[0]:=0X
  КОН
КОН СписатьИмяФайла;

(******************************************************************************)
ЗАДАЧА РазобратьЦепь(цепь+:ЦЕПЬ);
(* Цель:  обработать <цепь>, содержащую одну настройку
 * До:    <настройки>
 * После: <срдПуть> <настройки> *)
ПЕР
  добавить:КЛЮЧ;
УКАЗ
  ЕСЛИ (цепь[0] = '-') ИЛИ (цепь[0] = '/') ТО
    ЕСЛИ цепь[2] = '-' ТО
      добавить:=ОТКЛ
    ИНАЧЕ
      добавить:=ВКЛ
    КОН;
    ВЫБРАТЬ цепь[1] ИЗ
    | 'п': 
        ЕСЛИ добавить ТО
          нПроверки:=ВКЛ
        ИНАЧЕ
          нПроверки:=ОТКЛ
        КОН
    | 'о': 
        ЕСЛИ добавить ТО
          нОтладчик:=ВКЛ
        ИНАЧЕ
          нОтладчик:=ОТКЛ
        КОН
    | 'с': 
        Цепь.Удалить(цепь,0,2); (* '-с' *)
        СПИСАТЬ(цепь,срдПуть)
    | 'к': 
        Цепь.Удалить(цепь,0,2); (* '-к' *)
        Цепь.Добавить(ключи,цепь);
        Цепь.ДобавитьЗнак(ключи,';')
    ИНАЧЕ
      ЕСЛИ цепь[1] = '-' ТО
        ВЫБРАТЬ цепь[2] ИЗ
        | 'т': видПриложения:=впТекстовое
        | 'о': видПриложения:=впОконное
        | 'б': видПриложения:=впБиблиотека
        ИНАЧЕ
        КОН
      КОН
    КОН
  КОН
КОН РазобратьЦепь;

(******************************************************************************)
ЗАДАЧА РазобратьФайлНастроек-;
(* Цель:  обработать построчно файл с настройками
 * После: <настройки> и <срдПуть> *)
ПЕР
  поток:Читать.Поток;
  имяФайла:Файл.ВПолного;
  цепь:ЦЕПЬ[100];
УКАЗ
           (* имя файла головного отдела *)
  СписатьИмяФайла(имяФайла);
           (* имя файла настроек *)
  ЕСЛИ МПГ ТО
    Файл.ИзменитьТип(имяФайла,"МПГ")
  ИНАЧЕ
    Файл.ИзменитьТип(имяФайла,"ПГ")
  КОН;
  поток:=Читать.Открыть(имяФайла);
  ЕСЛИ поток = ПУСТО ТО (* придётся использовать файл настроек по умолчанию *)
    ЕСЛИ МПГ ТО
      поток:=Читать.Открыть("Настройки.МПГ")
    ИНАЧЕ
      поток:=Читать.Открыть("Настройки.ПГ")
    КОН
  КОН;
           (* значения настроек по умолчанию *)
  ЕСЛИ МПГ ТО
    нПроверки:=ОТКЛ;
  ИНАЧЕ
    нПроверки:=ВКЛ;
  КОН;
  нОтладчик:=ВКЛ;
  срдПуть:='.';
  ключи:='';
  видПриложения:=впТекстовое;
  ЕСЛИ поток = ПУСТО ТО
    ВОЗВРАТ
  КОН;
  поток.видЗнаков:=Читать.знУни;
  ПОКА НЕ Читать.Конец(поток) ВЫП
    Настройки.ЧитатьСтроку(поток,цепь);
    ЕСЛИ цепь # "" ТО
      РазобратьЦепь(цепь)
    КОН
  КОН;
  Читать.Закрыть(поток)
КОН РазобратьФайлНастроек;

(******************************************************************************)
ЗАДАЧА СобратьФайлНастроек;
(* Цель:  вывести настройки в файл ПГ *)
ПЕР
  поток:Писать.Поток;
  имяФайла:Файл.ВПолного;
  ключ:ЦЕПЬ[100];
  длина,нач,кон:ЦЕЛ;
УКАЗ
           (* имя файла головного отдела *)
  СписатьИмяФайла(имяФайла);
           (* имя файла настроек *)
  ЕСЛИ МПГ ТО
    Файл.ИзменитьТип(имяФайла,"МПГ")
  ИНАЧЕ
    Файл.ИзменитьТип(имяФайла,"ПГ")
  КОН;
  поток:=Писать.Открыть(имяФайла);
  ЕСЛИ поток = ПУСТО ТО
    ВОЗВРАТ
  КОН;
  поток.видЗнаков:=Писать.знУни;
  Писать.Цепь(поток,"; Включить CodeView отладку (не работает с ALink)^");
  ЕСЛИ НЕ нОтладчик ТО
    Писать.Цепь(поток,";")
  КОН;
  Писать.Цепь(поток,"-о^");
  ЕСЛИ НЕ МПГ ТО
    Писать.Цепь(поток,"; Отключить проверки времени выполнения^");
    ЕСЛИ нПроверки ТО
      Писать.Цепь(поток,";")
    КОН;
    Писать.Цепь(поток,"-п-^");
    Писать.Цепь(поток,"; Вид приложения:^");
    ВЫБРАТЬ видПриложения ИЗ
    | впТекстовое : Писать.Цепь(поток,"; текстовое^--т^")
    | впОконное   : Писать.Цепь(поток,"; оконное^--о^")
    | впБиблиотека: Писать.Цепь(поток,"; библиотека^--б^")
    КОН;
  КОН;
  Писать.Цепь(поток,"; Путь к СРЕДА.отд^-с");
  Писать.Цепь(поток,срдПуть);
  Писать.Цепь(поток,"^");
  нач:=0;
  длина:=ДЛИНА(ключи);
  КОЛЬЦО
    кон:=Цепь.ПозицияЗнака(";",ключи,нач);
    ЕСЛИ кон = -1 ТО
      кон:=длина
    КОН;
    ЕСЛИ нач >= кон ТО
      ВЫХОД
    КОН;
    Цепь.Часть(ключи,ключ,нач,кон-нач);
    Писать.Цепь(поток,"; Ключ^-к");
    Писать.Цепь(поток,ключ);
    Писать.Цепь(поток,"^");
    нач:=кон+1
  КОН;
  Писать.Закрыть(поток)
КОН СобратьФайлНастроек;

(******************************************************************************)
ЗАДАЧА Приём(поле:Поле.Доступ; посылка+:Ввод.Посылка);
(* получить и обработать управляющие послания *)
ПЕР
  код:ЦЕЛ;
УКАЗ
  ДЛЯ посылка ВИДА
  | Ввод.ОтКлавиш:
      код:=посылка.код;
      посылка.код:=0; (* скорее всего отработаем посылку *)
      ВЫБРАТЬ код ИЗ
      | 1BH: поле.состояние:=Поле.сОтмена (* Esc *)
      | 79H: поле.состояние:=Поле.сДалее  (* F10 *)
      | 0DH: поле.состояние:=Поле.сДалее  (* Ent *)
      | 70H: Справка.Номер(3)             (* F1 *)
      ИНАЧЕ
        посылка.код:=код
      КОН
  | Кнопка.Посылка:
      поле.состояние:=посылка.кнопка.действие
  ИНАЧЕ
  КОН             
КОН Приём;

(******************************************************************************)
ЗАДАЧА Выполнить-(окружение:Поле.Доступ);
ПОСТ
                (* цепочки для кнопок *)
  цДалее ="[ Далее ]";
  цОтмена="[ Отмена ]";

  длДалее =ДЛИНА(цДалее);
  длОтмена=ДЛИНА(цОтмена);
  промежуток=3; (* промежуток между кнопками *)
  занято=длДалее+промежуток+длОтмена;
  колонок=42;
  позДалее=1+(колонок-занято-1) ДЕЛИТЬ 2;
  позОтмена=позДалее+длДалее+промежуток;
ПЕР
  поле:Поле.Доступ;
  подложка:Подложка.Доступ;
  пПуть,пКлючи:Памятка.Доступ;
  черта:Черта.Доступ;
  хПуть,хКлючи:Холст.Доступ; 
  крПроверки,крОтладчик:Крестик.Доступ;
  мПуть,мКлючи:Метка.Доступ;
  кнДалее,кнОтмена:Кнопка.Доступ;
  тВидПриложения:Точка.Доступ;
  надписи:РЯД 3 ИЗ Надел.Надпись;
УКАЗ
  пПуть:=Памятка.Найти("НастройкиПуть");
  пКлючи:=Памятка.Найти("НастройкиКлючи");
           (* создаём поле *)
  поле:=Поле.Создать(0,0,17,колонок,окружение,ВКЛ,Приём);
           (* создаём наделы *)
  подложка:=Подложка.Создать   (0,0,0,0,"Настройки");
  хПуть:=Холст.СоздатьСтроку   (2,2,-2,пПуть);
  мПуть:=Метка.Создать         (1,2,"~Путь к отделу СРЕДА.отд",хПуть); 
  хКлючи:=Холст.СоздатьСтроку  (5,2,-2,пКлючи);
  мКлючи:=Метка.Создать        (4,2,"~Ключи для ЗАДАНО()",хКлючи); 
  крПроверки:=Крестик.Создать  (7,2,"Проверки ~времени выполнения"); 
  крОтладчик:=Крестик.Создать  (8,2,"~Создание данных для отладчика"); 
  надписи[0]:="~Текстовое приложение";
  надписи[1]:="~Оконное приложение";
  надписи[2]:="~Библиотека";
  тВидПриложения:=Точка.Создать(10,2,надписи); 
  черта:=Черта.Создать         (-3,0,1,0);
  кнДалее:=Кнопка.Создать      (-2,позДалее,цДалее,Поле.сДалее,ВКЛ); 
  кнОтмена:=Кнопка.Создать     (-2,позОтмена,цОтмена,Поле.сОтмена,ВКЛ); 
           (* заполняем наделы *)
  РазобратьФайлНастроек;
  ЕСЛИ МПГ ТО
    крПроверки.состояние:=Надел.сОтключен;
    тВидПриложения.состояние:=Надел.сОтключен
  ИНАЧЕ
    тВидПриложения.текущая:=видПриложения
  КОН;
  Холст.СтрокуИзЦепи(хПуть,срдПуть);
  Холст.СтрокуИзЦепи(хКлючи,ключи);
  крПроверки.отмечен:=нПроверки;
  крОтладчик.отмечен:=нОтладчик;
           (* добавляем наделы в порядке отрисовки и получения ввода *)
  Поле.ДобавитьНадел(поле,подложка);
  Поле.ДобавитьНадел(поле,хПуть);
  Поле.ДобавитьНадел(поле,мПуть);
  Поле.ДобавитьНадел(поле,хКлючи);
  Поле.ДобавитьНадел(поле,мКлючи);
  Поле.ДобавитьНадел(поле,крПроверки);
  Поле.ДобавитьНадел(поле,крОтладчик);
  Поле.ДобавитьНадел(поле,тВидПриложения);
  Поле.ДобавитьНадел(поле,черта);
  Поле.ДобавитьНадел(поле,кнДалее);
  Поле.ДобавитьНадел(поле,кнОтмена);
           (* основная работа *)
  Поле.Рисовать(поле);
  ПОВТОРЯТЬ
    Поле.Проверить(поле)
  ДО поле.состояние # Поле.сРабота;
           (* восстанавливаем окружение *)
  Поле.Рисовать(окружение);
           (* перебрасываем данные *)
  ЕСЛИ поле.состояние = Поле.сДалее ТО
    Холст.СтрокуВПамятку(хПуть);
    Холст.СтрокуВПамятку(хКлючи);
    Холст.СтрокуВЦепь(хПуть,срдПуть);
    Холст.СтрокуВЦепь(хКлючи,ключи);
    нПроверки:=крПроверки.отмечен;
    нОтладчик:=крОтладчик.отмечен;
    видПриложения:=тВидПриложения.текущая;
    СобратьФайлНастроек
  КОН
КОН Выполнить;

(******************************************************************************)
УКАЗ
  МПГ:=ОТКЛ
КОН ПолеНастройки.




Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
 email
 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы